﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FTools.Dominio;
using FTools.Persistencia;
using System.Data.SqlClient;
using System.Collections;
using FTools.Interface;
using FTools.Generico;

namespace FTools.Comunicacion
{
    class ComPedido : InterfacePedido
    {
        Conexion objConexion = new Conexion();
        SqlConnection conexion;
        SqlTransaction transaccion = null;
        PerPedido objPerPedido = new PerPedido();
        PerPedidoReng objPerPedidoReng = new PerPedidoReng();

        public Pedido obtenerPedido(long xIdPedido)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                Pedido objPedido = objPerPedido.obtenerPedido(conexion, transaccion, xIdPedido);
                objPedido.ColPedidoReng = objPerPedidoReng.obtenerColeccionPedidoReng(conexion, transaccion, objPedido.IdPedido);
                transaccion.Commit();
                return objPedido;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public Boolean existePedido(long xIdPedido)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                Boolean existe = objPerPedido.existePedido(conexion, transaccion, xIdPedido);
                transaccion.Commit();
                return existe;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public ArrayList obtenerColeccionPedido(long xIdPersona, String xEstado)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                ArrayList colPedido = objPerPedido.obtenerColeccionPedido(conexion, transaccion, xIdPersona, xEstado);
                foreach (Pedido objPedido in colPedido)
                {
                    objPedido.ColPedidoReng = objPerPedidoReng.obtenerColeccionPedidoReng(conexion, transaccion, objPedido.IdPedido);
                }
                transaccion.Commit();
                return colPedido;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public int altaPedido(Pedido xObjPedido)
        {
            PerPedidoReng objPerPedidoReng = new PerPedidoReng();
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                xObjPedido.IdPedido = FuncionesGenericas.generarNumerador("PEDIDO");
                int nro = objPerPedido.altaPedido(conexion, transaccion, xObjPedido);
                foreach (PedidoReng objPedidoReng in xObjPedido.ColPedidoReng)
                {
                    objPedidoReng.IdPedido = xObjPedido.IdPedido;
                    if (!objPerPedidoReng.existePedidoReng(conexion, transaccion, objPedidoReng.IdPedido, objPedidoReng.ObjSubProducto.IdSubProducto))
                    {
                        objPerPedidoReng.altaPedidoReng(conexion, transaccion, objPedidoReng);
                    }
                }
                transaccion.Commit();
                return nro;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public int bajaPedido(Pedido xObjPedido)
        {
            PerPedidoReng objPerPedidoReng = new PerPedidoReng();
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                objPerPedidoReng.bajaPedidoReng(conexion, transaccion, xObjPedido.IdPedido);//BORRA TODOS LOS PEDIDO_RENG
                int nro = objPerPedido.bajaPedido(conexion, transaccion, xObjPedido);
                transaccion.Commit();
                return nro;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public int modificaPedido(Pedido xObjPedido)
        {
            PerPedidoReng objPerPedidoReng = new PerPedidoReng();
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                objPerPedidoReng.bajaPedidoReng(conexion, transaccion, xObjPedido.IdPedido);//BORRA TODOS LOS PEDIDO_RENG
                foreach (PedidoReng objPedidoReng in xObjPedido.ColPedidoReng)//ALTA TODOS LOS PEDIDO_RENG
                {
                    objPedidoReng.IdPedido = xObjPedido.IdPedido;
                    if (!objPerPedidoReng.existePedidoReng(conexion, transaccion, objPedidoReng.IdPedido, objPedidoReng.ObjSubProducto.IdSubProducto))
                    {
                        objPerPedidoReng.altaPedidoReng(conexion, transaccion, objPedidoReng);
                    }
                }
                int nro = objPerPedido.modificaPedido(conexion, transaccion, xObjPedido);//MODIFICA PEDIDO
                transaccion.Commit();
                return nro;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }
    }
}
